Borrar registros duplicados usando SQL
El siguiente procedimento almacenado es un ejemplo o guía que te permitira eliminar registros duplicados de una tabla y dejando un registro (1) por cada duplicado. Te sugiero hacer primero un conteo de los registros que tienes y que realices una sumatoria de los registros duplicados que se obtiene del primer select.
Valor Duplicado1 5
Valor Duplicado2 5
Valor Duplicado3 5
Valor Duplicado4 4
Valor Duplicado5 4
Valor Duplicado6 3
Por ejemplo el total de la sumatoria es 26 a este valor le restamos la cantidad de valores duplicados que es 6.
El total de registros duplicados a eliminar es 20. Y con un select del total de filas de la tabla le restas 20 y este sera el total de filas que deberas tener al final de jecutar el siguiente procedimiento almacenado.
/********************************************************************************************************
* Elaborado Por : Omar Acosta *
* Acción : Eliminar duplicados de una tabla con sql server 2000 o 2005 *
* Fecha Creación : 2009/10/14 *
*********************************************************************************************************/
CREATE PROCEDURE [dbo].[Duplicados]
AS
–INICIALIZAMOS LA TRANSACCION
BEGIN TRANSACTION
DECLARE @VALORDUPLICADO VARCHAR(20)
DECLARE @NUMVECESDUPLICADO INT
–Se declara el cursor principal que obtiene el valor
–del campo duplicado y el numero de veces que se repite
DECLARE CURSOR_DUPLICADOS CURSOR FOR
–usted debe reemplazar el nombre de la tabla y el nombre del
–campo por el cual va a eliminar este ejemplo lo realize con la tabla GIFCONSUMO
SELECT VEHPLACA AS ValorDuplicado, COUNT(1) AS NumVecesDuplicado
FROM GIFCONSUMO
GROUP BY VEHPLACA
HAVING (COUNT(1) > 1)
ORDER BY NumVecesDuplicado
–Recorre el cursor
OPEN CURSOR_DUPLICADOS
FETCH NEXT FROM CURSOR_DUPLICADOS
INTO @VALORDUPLICADO,@NUMVECESDUPLICADO
WHILE @@FETCH_STATUS = 0
BEGIN
–para controlar que no se borren todos los registros
–y se mantenga un valor en la tabla
DECLARE @CONTADOR INT
SET @CONTADOR =1
— el tipo de dato depende del valor definido para la tabla
DECLARE @ID NUMERIC(18,0)
–se elimina el registro(s) duplicados pero se deja uno solo.
DECLARE CURSOR_BORRARDUPLICADOS CURSOR FOR
–se consulta los id de los valores duplicados
SELECT CONID AS ID
FROM GIFCONSUMO
WHERE VEHPLACA = @VALORDUPLICADO
–Recorre el cursor de boorado de registros
OPEN CURSOR_BORRARDUPLICADOS
FETCH NEXT FROM CURSOR_BORRARDUPLICADOS
INTO @ID
WHILE @@FETCH_STATUS = 0
BEGIN
–ELIMINAMOS LOS REGISTROS DUPLICADOS
–MENOS EL ULTIMO REGISTRO
IF(@CONTADOR < @NUMVECESDUPLICADO)
DELETE GIFCONSUMO WHERE CONID= @ID
–aumentamos el contador para controloar no borrar
–el ultimo registro
SET @CONTADOR = @CONTADOR + 1
FETCH NEXT FROM CURSOR_BORRARDUPLICADOS
INTO @ID
END
–cierro y libero el cursor interno
CLOSE CURSOR_BORRARDUPLICADOS
DEALLOCATE CURSOR_BORRARDUPLICADOS
–cierro y libero el cursor principal
FETCH NEXT FROM CURSOR_DUPLICADOS
INTO @VALORDUPLICADO,@NUMVECESDUPLICADO
END
CLOSE CURSOR_DUPLICADOS
DEALLOCATE CURSOR_DUPLICADOS
–ingresa por este lado si ocurre error o al finalizar el proceso
IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION
RETURN –1
END
COMMIT TRANSACTION